1、写SessionFilter (自定义)过滤器,要实现Filter接口

import java.io.IOException;import java.util.regex.Pattern;import java.net.URLEncoder;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; public class SessionFilter implements Filter{ /要检讨的 session 的名称 / private String sessionKey; /须要打消(不拦截)的URL的正则表达式 / private Pattern excepUrlPattern; /检讨不通过期,转发的URL / private String forwardUrl; public void init(FilterConfig cfg) throws ServletException{ System.out.println(\公众SessionFilter的启动\"大众); sessionKey= cfg.getInitparameter(\"大众sessionKey\"大众); String excepUrlRegex = cfg.getInitParameter(\"大众excepUrlRegex\"大众); if (!StringUtils.isBlank(excepUrlRegex)){ excepUrlPattern= Pattern.compile(excepUrlRegex); } forwardUrl= cfg.getInitParameter(\公众forwardUrl\公众); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println(\"大众实行SessionFilter过滤\"大众); //如果 sessionKey 为空,则直接放行(个人以为在此这个判断条件没有用) if (StringUtils.isBlank(sessionKey)){ chain.doFilter(req,res); return; } / 要求 http://127.0.0.1:8080/sm/index.jsp?&a=1&b=2 时 request.getRequestURL(): http://127.0.0.1:8080/sm/index.jsp request.getContextPath(): /sm request.getServletPath():/index.jsp request.getRequestURI(): /sm/index.jsp request.getQueryString():a=1&b=2 / HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String servletPath = request.getServletPath(); System.out.println(\"大众servletPath=\"大众+servletPath); //如果要求的路径与forwardUrl相同,或要求的路径是打消的URL时,则直接放行 if (servletPath.equals(forwardUrl)|| excepUrlPattern.matcher(servletPath).matches()) { chain.doFilter(req,res); return; } //把稳:adminName为用户登录名,必须在登录信息传到后台时放到Session //里,我的项目在@Controller的登任命户传到后台时当判断用户名和密码精确 //后立马到Session里,浸染是用来判断Session如果还有效,返回不为空,可以在后台连续操作;如果超时了,返回null,则跳到登录页面 Object sessionObj = request.getSession().getAttribute(\"大众adminName\公众); //如果Session为空,则跳转到指定页面 if (sessionObj== null){ String contextPath = request.getContextPath(); String redirect = servletPath + \"大众?\"大众 +StringUtils.defaultString(request.getQueryString()); response.sendRedirect(contextPath+ StringUtils.defaultIfEmpty(forwardUrl, \公众/\"大众) +\"大众?redirect=\"大众 +URLEncoder.encode(redirect, \"大众UTF-8\公众)); }else { //如果能通过,就放行 chain.doFilter(req,res); } } public void destroy(){ System.out.println(\"大众SessionFilter的销毁\公众); }}

笔墨有一处要把稳:即

Object sessionObj = request.getSession().getAttribute(\"大众adminName\公众);

中的“adminName”要在后台有设置,否则不起浸染,比如我在Controller中这样设置

jsp内置request实现用户登录关于登录权限的设置用过滤器解决的办法 React

2、在web.xml中配置如下过滤器信息(重点在如何设置哪些路径须要拦截,哪些不须要拦截)

<!-- 检讨用户是否登录了系统的过滤器配置 开始 --><filter><filter-name>SessionFilter</filter-name><filter-class>com.py.util.wrb.SessionFilter</filter-class><init-param><description>将当前登录的用户的信息保存在session 中时利用的key,如果没有配置此参数,则该过滤器不起浸染</description><param-name>sessionKey</param-name><param-value>adminName</param-value></init-param><init-param><description> 如果用户未登录(即在session 中 key 为 sessionKey 的属性不存在或为空),则将要求重定向到该 url。
该url 不包含web运用的 ContextPath。
如果不配置此参数,则在用户未登录系统的情形下, 直接重定向到web运用的根路径(/) </description><param-name>forwardUrl</param-name><param-value>/index.jsp</param-value></init-param><init-param><description> 不须要进行拦截的url 的正则表达式,即:如果当前要求的 url 的 servletPath 能匹配该正则表达式,则直接放行(纵然未登录系统)。
此参数的值一样平常为loginServlet 和 registServlet 等。
其余,参数redirectUrl 的值不用包含在该正则表达式中,由于 redirectUrl 对应的 url 会被自动放行。
还有一点须要解释的是,该参数的值不包含web运用的ContextPath。
</description><param-name>excepUrlRegex</param-name><!-- 不须要拦截的路径 (login_login_execute|login_2_login).do 会在后面有详细的阐明--><param-value>/(jumpIndex|loginAdmin)</param-value></init-param></filter><!-- / 表示所有的都要进行过滤--><filter-mapping><filter-name>SessionFilter</filter-name><url-pattern>/</url-pattern></filter-mapping>

耐心讲解:打个比方,如果你登录你的系统要输入这样的地址进入登录界面:

http://127.0.0.1:8080/sm/index.jsp

那么forwardUrl该当是这样写,代表页面的登录页面(forwardUrl可自定义名称,当然要见词知意最好,下同)

<param-name>forwardUrl</param-name><param-value>/index.jsp</param-value>

在一个别系中,我们一样平常把登录页面放在web-inf的表面,否则直接访问不了(个人见地),为了起到保护浸染,我们在登录页面点击登录,要做一些路径跳转,有多个跳转就有多少个路径,直到后台的主界面,这些路径也必须不能拦截,否则你登录不到后台。
如下,这里解释登录到后台要经由jumpIndex和loginAdmin路径,“|”代表“或”

<description> 不须要进行拦截的url 的正则表达式,即:如果当前要求的 url 的 servletPath 能匹配该正 则表达式,则直接放行(纵然未登录系统)。
此参数的值一样平常为loginServlet 和 registServlet 等。
其余,参数redirectUrl 的值不用 包含在该正则表达式中,由于 redirectUrl 对应的 url 会被自动放行。
还有一点须要解释的是,该参数的值不包含web运用的ContextPath。
</description><param-name>excepUrlRegex</param-name><param-value>/(jumpIndex|loginAdmin)</param-value>

3、为了方便测试,最好设置Session的有效韶光短一点,如何设置Session有效韶光百度有一大堆,我是在web.xml重配置的,如:我设置有效韶光为1分钟

<session-config><session-timeout>1</session-timeout></session-config>

这样可以在Session失落效后直接登录后台看是否进得去

比如我登录后台后的一个路径为:http://127.0.0.1:8080/sm/camera

当Session失落效后在新的地址栏上输入:http://127.0.0.1:8080/sm/camera

看是否能进入。
进不去,解释过滤器起浸染了。

至此完成,有什么问题可以留言,我会及时回答!
后面我会连续完善这篇文章,希望各位能给点指示,感激!

声明:我通过百度上找很多资料,结合自己项目做的,我希望能对大家有所帮助。