1. 程式人生 > >web工程過濾器和springMVC攔截器的一些總結

web工程過濾器和springMVC攔截器的一些總結

今天自己寫SSO(單點登入)發現一些問題的總結


1。因為原先有攔截器inteceptor,所以想著就直接用攔截器搞好了,後來發現不行,

原因是:工程預設是/訪問,是在web中配置預設的,並沒有呼叫任何方法(而攔截器是攔截方法的),所以無論我修改spring配置檔案,修改攔截條件都始終攔截不上

所以個人感覺,登入這種操作應該是在filter來搞,因為過濾器(過濾一切請求,即便是還沒有登入)

2.所以改用filter過濾器

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		 	HttpServletRequest request = (HttpServletRequest) servletRequest;
	        HttpServletResponse response = (HttpServletResponse) servletResponse;
	        
	        String urlString = request.getRequestURI();
	        System.out.println("client請求連結:"+urlString);
	        if(urlString.contains("css")||urlString.contains("js")){
	        	filterChain.doFilter(servletRequest, servletResponse);
	        	return;
	        }
	        HttpSession session = request.getSession();
	        String username = (String) session.getAttribute("username");
	        
	        String ticket = request.getParameter("ticket");
	        String url = URLEncoder.encode(request.getRequestURL().toString(), "UTF-8");

	        if (null == username) {  
	            if (null != ticket && !"".equals(ticket)) {  
	            	JSONObject jsonObject = httpRequest("http://localhost:8080/yxy_author/ticketService?ticket="+ticket, "GET");
	            	if(jsonObject!=null){
	            		username = (String) jsonObject.getJSONObject("data").get("username");
	            	}
	                if (null != username && !"".equals(username)) {  
	                    session.setAttribute("username", username);  
	                    filterChain.doFilter(request, response);  
	                } else {  
	                    response.sendRedirect("http://localhost:8080/yxy_author/login?service=" + url);  
	                }  
	            } else {  
	                response.sendRedirect("http://localhost:8080/yxy_author/login?service=" + url);  
	            }  
	        } else {  
	            filterChain.doFilter(request, response);  
	        } 
	}
核心程式碼就這麼幾句


記得配置web.xml中新增這個過濾器

   <filter>  
        <filter-name>ssoClientFilter</filter-name>  
        <filter-class>com.cyt.babyhealth.tj.filter.SSOClientFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>ssoClientFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    

============================下面是授權服務工程程式碼==============================================


SSOServerFilter程式碼

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		 	
			HttpServletRequest request = (HttpServletRequest) servletRequest;
	        HttpServletResponse response = (HttpServletResponse) servletResponse;
	        
	        String test = ((HttpServletRequest) servletRequest).getServletPath();
	        
	        
	        String urlString = request.getRequestURI();
	        System.out.println("service請求連結:"+urlString);
	        if("/yxy_author/login".equals(urlString)||"/yxy_author/ticketService".equals(urlString)||urlString.contains("css")||urlString.contains("js")){
	        	filterChain.doFilter(servletRequest, servletResponse);
	        	return;
	        }
	        
	        String service = request.getParameter("service");
	        String ticket = request.getParameter("ticket");
	        Cookie[] cookies = request.getCookies();
	        String username = "";
	        if (null != cookies) {
	            for (Cookie cookie : cookies) {
	                if ("sso".equals(cookie.getName())) {
	                    username = cookie.getValue();
	                    break;
	                }
	            }
	        }

	        if (null == service && null != ticket) {
	            filterChain.doFilter(servletRequest, servletResponse);
	        }

	        if (null != username && !"".equals(username)) {
	        	
	        	System.out.println("service使用者名稱:"+username);
	        	
	            long time = System.currentTimeMillis();
	            String timeString = username + time;
	            MemCached memCached = (MemCached) SpringUtil.getBean("memcachedClient");
	            memCached.set(timeString, 1000,username);
	            StringBuilder url = new StringBuilder();
	            if(service!=null){
	            	url.append(service);
	            	
	            	if (0 <= service.indexOf("?")) {
	            		url.append("&");
	            	} else {
	            		url.append("?");
	            	}
	            	url.append("ticket=").append(timeString);
	            	
	            }
	            response.sendRedirect(url.toString());
	            
	        } else {
	        		filterChain.doFilter(servletRequest, servletResponse);
	        }
		
	}

授權中心login

@RequestMapping(value = "/ticketService")
	@ResponseBody
	public ApiResult  ticketService(HttpServletRequest request, HttpServletResponse response){
		ApiResult apiResult = new ApiResult();
		
		String ticket = request.getParameter("ticket");
        String username = memcachedClient.get(ticket);
        memcachedClient.delete(ticket);
        
//        Object  customVO   = memcachedClient.get(ticket+".user");
//        memcachedClient.delete(ticket+".user");
        
        
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("username",username);
//        data.put("customVO", customVO);
        apiResult.setData(data);

		
		return apiResult;
		
	}
	/**
	 * @param loginname
	 * @param pwd
	 * @return 登入
	 * @throws IOException 
	 */
	@RequestMapping(value = "/login")
	public String login(@RequestParam(required = false) String loginname,
			@RequestParam(required = false) String pwd,
			String service,HttpServletResponse response) throws IOException {
        
		if(loginname!=null&&loginname.trim().length()>0&&pwd!=null&&pwd.trim().length()>0){
			ImCustom admin = imCustomService.findLoginName(loginname);
			if (admin != null) {
				if(admin.getStatus() == 1){
					if (admin.getPwd().equals(MD5.sign(pwd + PropertiesUtil.config.get("md5.key")))) {
						if (admin.getStatus() == 1) {
							
						
							
							String sysIds = admin.getSysIds();
							
							List<AdminAuthorSys> adminAuthorSys = new ArrayList<AdminAuthorSys>();
							String[] sysIdsArrStrings = sysIds.split(",");
							
							for (int i = 0; i < sysIdsArrStrings.length; i++) {
								String sysIdString = sysIdsArrStrings[i];
								AdminAuthorSys adminAuthorSyss = adminAuthorSysService.find(Integer.parseInt(sysIdString));
								adminAuthorSys.add(adminAuthorSyss);
							}
							ImCustomVO  customVO = new ImCustomVO();
							BeanUtils.copyProperties(admin, customVO);
							customVO.setAdminSyses(adminAuthorSys);
							
							ServletContext ContextA =getSession().getServletContext();
							ContextA.setAttribute("session",getSession() );
							getSession().setAttribute("admin", customVO);//這樣儲存只能在當前應用內看
							
							
							System.out.println("44444444444444444444444444444444");
							//設定cookie
							  Cookie cookie = new Cookie("sso", admin.getUname());
							  cookie.setPath("/");
							  response.addCookie(cookie);
							//admin1503379134793 admin
					        //admin1503379134793.user	 [email protected]		            
					            long time = System.currentTimeMillis();
					            String timeString = admin.getUname() + time;
					            memcachedClient.set(timeString, 10000, admin.getUname());
					            
//					            JSONObject.toJSON(customVO);
					          //要想在應用外用,則需要session共享,放在memcached中
//								memcachedClient.set(timeString+".user", 10000, JSONObject.toJSON(customVO));
					            if (null != service) {
					            	StringBuilder url = new StringBuilder();
					            	url.append(service);
					            	if (0 <= service.indexOf("?")) {
					            		url.append("&");
					            	} else {
					            		url.append("?");
					            	}
					            	url.append("ticket=").append(timeString);
					            	response.sendRedirect(url.toString());
					            	return null;
					            }else {
					            	response.sendRedirect("/yxy_author/index.jsp");
					            	return null;
								}
							
						} else {
							getRequest().setAttribute("error", "該使用者禁止登入");
						}
					} else {
						getRequest().setAttribute("error", "密碼錯誤");
					}
				}else{
					getRequest().setAttribute("error", "使用者已被禁止");
				}
			} else {
					getRequest().setAttribute("error", "該使用者不存在");
			}
		}
		return "/login";
	}

	/**
	 * @return 退出登入
	 */
	@RequestMapping(value = "/logout")
	public String logout() {

		getSession().invalidate();

		return "/login";
	}
	

最後記得web.xml配置

    <filter>  
        <filter-name>ssoServerFilter</filter-name>  
        <filter-class>com.cyt.babyhealth.tj.filter.SSOServerFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>ssoServerFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 



相關推薦

web工程過濾器springMVC攔截一些總結

今天自己寫SSO(單點登入)發現一些問題的總結 1。因為原先有攔截器inteceptor,所以想著就直接用攔截器搞好了,後來發現不行, 原因是:工程預設是/訪問,是在web中配置預設的,並沒有呼叫任何方法(而攔截器是攔截方法的),所以無論我修改spring配置檔案,修

Java過濾器SpringMVC攔截之間的關係與區別

  由於最近做的專案中有一部分是介面遠端呼叫,用到了接入許可權和業務許可權的鑑定,需要採用SpringMVC的攔截器,以前用Struts2的時候用過攔截器,而SpringMVC的攔截器功能之前沒研究過,所以這次來稍微研究一下,得出的結論是SpringMVC的攔截器和Struts2的攔截器原理幾乎是一模一樣的,

Java Servlet 過濾器springmvc 攔截的區別?

結果 dap ber 如果 exce 流程 @override clas 出錯 前言:在工作中,遇到需要記錄日誌的情況,不知道該選擇過濾器還是攔截器,故總結了一下。 servlet 過濾器 定義   java過濾器能夠對目標資源的請求和響應進行截取。過濾器的工作方式分為

Java過濾器SpringMVC攔截之間的關係與區別

       今天學習和認識了一下,過濾器和SpringMVC的攔截器的區別,學到了不少的東西,以前一直以為攔截器就是過濾器實現的,現在想想還真是一種錯誤啊,而且看的比較粗淺,沒有一個全域性而又細緻的

Java過濾器SpringMVC攔截之間的一順序點關係

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.p

Java自定義註解 springMVC攔截 配合使用記錄系統操作日誌的案例

自定義註解的用法, 好多人不知道, 在這裡, 程式碼的註釋中, 我已經詳細的介紹了, 另外就是很多人不知道自定義註解如何使用, 這裡配合springMVC攔截器, 做一個非常實用的案例. 案例: 記錄系統操作的日誌 首先是定義註解: package cn.wxy.ssm

springMVC攔截學習總結

自定義攔截器概述 Spring MVC也可以使用攔截器對請求進行攔截處理,使用者可以自定義攔截器來實現特定的功能,自定義的攔截器可以實現HandlerInterceptor 介面,或者可以繼承HandlerInterceptorAdapter 介面卡類   preHandle

springMVC攔截過濾器總結

cal .org 文件 bat system als request ping blog 攔截器: 用來對訪問的url進行攔截處理 用處: 權限驗證,亂碼設置等 spring-mvc.xml文件中的配置: <beans xmlns="http://www.sprin

springmvc攔截filter過濾器執行流程

springmvc攔截器當進入攔截器鏈中的某個攔截器,並執行preHandle方法後 1.當preHandle方法返回false時,從當前攔截器往回執行所有攔截器的afterCompletion方法,再

SpringMVC攔截自定義註解

tor spring system image ssi 定義 技術分享 style gets 一、攔截器   1、攔截所有URL <mvc:interceptors> <bean class="myInterceptor.MyIntercept

springmvc攔截使用原理理解

res ont str ppi lan ati IT 做的 string 與struts2類似,springmvc的攔截器主要作用也是在服務端真正處理請求前後進行一些相關的操作。 例如初始化資源,權限監控,會話設置,菜單獲取,資源清理等。 步驟: 1. 定義攔截器

關於SpringMVC攔截是否執行緒安全及多執行緒訪問產生的requestsession

Springmvc的攔截器預設是執行緒不安全,即全域性屬性就是共享的即不執行緒安全(如下程式碼中變數i就是執行緒不安全的)。 定義了一個攔截器: 並配置了一個SessionListener(關於JavaWeb的Listener配置這裡沒貼程式碼): 設定sess

SpringMVC攔截中獲得Controller方法名註解資訊(用於驗證許可權)

在使用SpringMVC進行專案的時候用到了許可權驗證。 表分為: 使用者表; 角色表; 資源表。 使用者-角色-資源都是多對多的關係,驗證無非就是收到請求後,在攔截器迴圈判斷使用者是否有許可權執行操作。 方法一:通過request獲得使用者的U

Springmvc 攔截的基本配置使用

1.DispatcherServlet     SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet。     DispatcherServlet是前置控制器,配置在web.xml檔案中的。攔截匹配的請求,Servlet攔截匹配規則要自已定

springmvcstruts2攔截的簡單使用以及配置

public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {System.out.println("進入方法之後。");}@

基於SpringMVC攔截註解實現controller中訪問權限控制

pattern efi figure super 設置 復制代碼 check pin system SpringMVC的攔截器HandlerInterceptorAdapter對應提供了三個preHandle,postHandle,afterCompletion方法。

SpringMVC攔截

tools nts exc java .net ping db2 handler ppi 配置springmvc.xml代碼: [java] view plain copy <?xml version="1.0" e

MVC攔截,MVC過濾器,MVC ActionFilterAttribute攔截過濾器,OnActionExecuting

mvc攔截器 mvc過濾器 mvc actionfilterattribute攔截器過濾器 該過濾攔截器動態攔截字符串和實體類檢查是否有關鍵字,對字符串和動態實體類進行修改很再提交。第一步:新的攔截器類名並繼承ActionFilterAttribute :CustomerFilterAttrib

SpringMVC 攔截

div path 調用 打開 lns -m www 輸出 編程) 類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理. 常用場景: 1、日誌記錄:記錄請求信息的日誌,以便進行信息監控、信息統計、計算PV(Page View)等。

spring boot框架學習8-【幹貨】spring boot的web開發(4)-自定義攔截處理權限

凱哥spring boot spring boot框架 本章節主要內容:通過前面的學習,我們了解並快速完成了spring boot第一個應用。spring boot企業級框架,那麽spring boot怎麽讀取靜態資源?如js文件夾,css文件以及png/jpg圖片呢?怎麽自定義消息轉換器呢?怎麽自定