现在的位置: 首页 > 综合 > 正文

jsp filter登录限制过滤器

2018年04月27日 ⁄ 综合 ⁄ 共 3025字 ⁄ 字号 评论关闭
UserFilter.java 代码
package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils; 

/**  * 用于检查用户是否登录了系统的过滤器<br>
     * 创建日期:2012-04-24
     *   */
public class UserFilter implements Filter {
	
	/** 要检查的 session 的名称 */
	private String sessionKey;
	
	/** 需要排除(不拦截)的URL的字符串 */
	private String excepUrl;
	
	/** 检查不通过时,转发的URL */
	private String redirectUrl;
	
	public void init(FilterConfig cfg) throws ServletException {
		sessionKey = cfg.getInitParameter("sessionKey");
		redirectUrl = cfg.getInitParameter("redirectUrl");
		excepUrl = cfg.getInitParameter("excepUrl");
	}
	
	
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		// 如果 sessionKey 为空,则直接放行
		if (StringUtils.isBlank(sessionKey)) {
			chain.doFilter(req, res);
			return;
		}
//      * 请求 http://127.0.0.1:8080/webApp/home.jsp?&a=1&b=2 时
//          * request.getRequestURL(): http://127.0.0.1:8080/webApp/home.jsp
//         * request.getContextPath(): /webApp  
//         * request.getServletPath():/home.jsp 
//         * request.getRequestURI(): /webApp/home.jsp 
//         * request.getQueryString():a=1&b=2
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		String servletPath = request.getServletPath();//当前页面的路径(如"/index.jsp")
		// 如果请求的路径与redirectUrl(将要跳转的页面)相同,或请求的路径是排除的URL时,则直接放行
		if (servletPath.equals("/"+redirectUrl) || excepUrl.contains(servletPath)) {
			chain.doFilter(req, res);
			return;
		}
		
		Object sessionObj = request.getSession().getAttribute(sessionKey);
		// 如果Session为空,则跳转到指定页面 
		 if (sessionObj == null) {
			response.sendRedirect(redirectUrl);
			 } else { 
				 chain.doFilter(req, res);
			}
		 }
	 
	public void destroy() {
		
	} 

}

web.xml  代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <filter>
   		<filter-name>UserFilter</filter-name>
   		<filter-class>filter.UserFilter</filter-class>
   		<init-param>
             <description>
             		将当前登录的用户的信息保存在 session 中时使用的key,
             		如果没有配置此参数,则该过滤器不起作用
             </description>
         	 <param-name>sessionKey</param-name>
         	 <param-value>userInfo</param-value>
    	</init-param>
    	<init-param>
       		<description>
                 	如果用户未登录(即在 session 中 key 为 sessionKey 的属性不存在或为空),
                 	则将请求重定向到该 url。该 url 不包含web应用的 ContextPath。
                	 如果不配置此参数,则在用户未登录系统的情况下,直接重定向到web应用的根路径(/)      
       		</description>
            <param-name>redirectUrl</param-name>
            <param-value>index.jsp</param-value>
       </init-param>
       <init-param>
             <description>
                                  不需要进行拦截的 url,即:如果当前请求的 url 的 servletPath 能在此excepUrl里,则直接放行(即使未登录系统)。
                                   格式如(/checkuser.jsp /up.jsp)             
             </description>
             <param-name>excepUrl</param-name>
             <param-value>/checkuser.jsp</param-value>
      </init-param>
 </filter>
                     

<filter-mapping>
    	<filter-name>UserFilter</filter-name>
   		<url-pattern>*.jsp</url-pattern>
</filter-mapping>
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
</web-app>

抱歉!评论已关闭.