1. 程式人生 > >利用spring mvc 攔截器 鑑權

利用spring mvc 攔截器 鑑權

1.需求場景

利用攔截器實現使用者登入鑑權

2.專案環境

spring spring mvc mybatis  mysql

3.實現方法

package com.jlc.action;

import java.util.Enumeration;
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/*****
 * 
* @ClassName: LoginInterceptorAction 
* @Description: TODO  攔截器
* @author demo
* 
*
 */
@Service
public class LoginInterceptorAction implements HandlerInterceptor {
	//記錄日誌物件
    Logger log = Logger.getLogger(LoginInterceptorAction.class.getName());
    @Autowired
    private UserRoleService userRoleService;
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse respone, Object obj, Exception e)
			throws Exception {
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse respone,
			Object obj, ModelAndView view) throws Exception {
		// TODO Auto-generated method stub
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			 Object obj) throws Exception {
		     String username = (String) request.getSession().getAttribute("username");
			   //獲取使用者擁有的許可權列表(getAllRight方法使用者登陸後自行實現)
			   List<String> list = getAllRight(username);
		     String callback=request.getParameter("callbackparam");
		     String url = request.getRequestURI();
		     String ip=getIpAddr(request);
		     JSONObject jo = new JSONObject();
		     String param = getAllParameter(request);
		     boolean flag = false;
             //登入地址不必攔截
		    if(   url.indexOf("login/in")!=-1
		    	 flag = true;
		     }else{
		    	 if(null == username ||username.equals("")){
		    		 jo.put("code", "1002");//會話超時 退出系統
		    		 response.getWriter().write(callback+"("+jo.toString()+")");
		    		 flag = false;
			     }else if(hasRight(url,list)){
			    	 flag = true;
		         }else{
			    	 flag = false;
			    	 jo.put("code", "1003");//沒有許可權訪問
		    		 response.getWriter().write(callback+"("+jo.toString()+")");
			     }
		     }
		     return flag;
	}
	
	
	 /***
	 *獲取訪問者IP
	 *
	 ***/
    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("X-Real-IP");
        if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        ip = request.getHeader("X-Forwarded-For");
        if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
        // 多次反向代理後會有多個IP值,第一個為真實IP。
        int index = ip.indexOf(',');
            if (index != -1) {
                return ip.substring(0, index);
            } else {
                return ip;
            }
        } else {
             return request.getRemoteAddr();
        }
    }
    
  
    
    /**
     * 
    * @Title: hasRight 
    * @Description: TODO 鑑權
    * @param authList
    * @param url
    * @return
     */
    public boolean hasRight(String url,List<String> list){
    	 
    	 boolean flag=false;
    	 if(list.size()>0){
         if(list.contains(url)){
        	 flag=true;
         }else{
        	 flag =false;
         }
         }else{
        	 flag = false;
         }
    	return flag;
    }
    
    /***
     * 
    * @Title: getAllParameter 
    * @Description: TODO 返回引數列表
    * @param request
    * @return
     */
    public String getAllParameter(HttpServletRequest request){
    	String str="";
    	Enumeration<String> keys = request.getParameterNames(); 
    	while(keys.hasMoreElements()) { 
    	    String k = keys.nextElement(); 
    	    String v = request.getParameter(k);
    	    //System.out.println(k + " = " + request.getParameter(k) ); 
    	    str+=k+"="+v+",";
    	} 
    	return str;
    }
}