设置登录界面的访问地址不拦截,如果直接访问除登录界面的地址时,那么此时session就为空,则直接跳转回登录界面。
话不多说,直接上代码
web.xml文件配置拦截部分代码
<!-- 检查后端用户是否登录了管理系统的过滤器配置 开始 -->
<filter>
<filter-name>BackendSessionFilter</filter-name>
<filter-class>com.Lin.jianji.filter.LoginFilter</filter-class>
<init-param>
<description>将当前登录的用户的信息保存在 session 中时使用的key,如果没有配置此参数,则该过滤器不起作用</description>
<param-name>sessionKey</param-name>
<param-value>BACKEND_SESSION_USER_KEY</param-value>
</init-param>
<init-param>
<description>
如果用户未登录(即在 session 中 key 为 sessionKey 的属性不存在或为空),则将请求重定向到该 url。
该 url 不包含web应用的 ContextPath。
如果不配置此参数,则在用户未登录系统的情况下,直接重定向到web应用的根路径(/)
</description>
<param-name>forwardUrl</param-name>
<param-value>/resources/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>
<!-- 不拦截 -->
<param-value>/login.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>BackendSessionFilter</filter-name>
<url-pattern>/resources/welocme.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>BackendSessionFilter</filter-name>
<url-pattern>/welcome/*</url-pattern>
</filter-mapping>
<!-- 检查后端用户是否登录了管理系统的过滤器配置 结束 -->
主要的那些都用红色框框起来了
少圈了spring下的root-context.xml
里面也要有这段代码
<!-- 启动项目时Spring创建一个过滤器对象交由代理过滤器管理(DelegatingFilterProxy) -->
<beans:bean id="BackendSessionFilter" class="com.Lin.jianji.filter.LoginFilter">
</beans:bean>
接下来就是LoginFilter.java文件的编写
package com.Lin.jianji.filter;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.regex.Pattern;
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 com.google.common.base.Strings;
public class LoginFilter implements Filter {
/** 要检查的 session 的名称 */
private String sessionKey;
/** 需要排除(不拦截)的URL的正则表达式 */
private Pattern excepUrlPattern;
/** 检查不通过时,转发的URL */
private String forwardUrl;
public void init(FilterConfig cfg) throws ServletException {
sessionKey = cfg.getInitParameter("sessionKey");
String excepUrlRegex = cfg.getInitParameter("excepUrlRegex");
if (!Strings.isNullOrEmpty(excepUrlRegex)) {
excepUrlPattern = Pattern.compile(excepUrlRegex);
}
forwardUrl = cfg.getInitParameter("forwardUrl");
if(Strings.isNullOrEmpty(forwardUrl)){