みなさんこんにちは、私はキャベツに覆われたキャベツです。
テクノロジー:SSMフレームワーク、インターセプター、フィルターの
背景:ログインまたは登録しているときに、プロジェクトの残りの部分にアクセスするときにアクセスを要求することはできません。これを達成する方法は2つあります。1つはフィルターでフィルターする方法ですが、インターセプターによるインターセプト
ログインページ:
登録ページ:
インターセプター固有の実装:
1.まず、春-servlet.xmlインターセプターの構成の詳細
"
如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
<mvc:mapping path="/**" />
<!-- 但是排除下面这些,也就是不拦截请求 -->
<mvc:exclude-mapping path="/login.jsp" />
<mvc:exclude-mapping path="/users/login.do" />
<mvc:exclude-mapping path="/users/register.do" />
<bean class="com.bzbs.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2. HandlerInterceptorインターフェース
を実装するクラスを作成します。postHandle()メソッドに特定のビジネス要件を書き込みます。これは、ページがインターセプトされた後に行う必要があることです。
public class LoginInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//获取session 判断里面是否存有用户信心,没有则返回登录页面
HttpSession session=request.getSession();
Object user =session.getAttribute("user");
Object password =session.getAttribute("password");
if(user==null || password==null){
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath()+"/system/login.jsp?returnURL="+url);
return false;
}
return true;
}
}
ログインするかどうかを決定するためにここにいます。すでにログインしている場合は、ブロックされたページに直接アクセスできます。セッションに値がない場合は、引き続き待機中のページに戻します。その後、アクセスする元のアドレスがスプライスされます。ログイン後、直接アクセスして、アクセスできるようにすることができますページははるかに便利です。
フィルターの実装は次のとおりです。
1. web.xmlコンテンツを構成する
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.bzbs.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
url-patternはフィルタリングするページです/ *はすべてのページをブロックする必要があることを意味します。ここではホワイトリストとブラックリストを設定できます。その方法はここでは説明しません
2. Filterインターフェースを実装するクラスを作成します
/**
* @ClassName: LoginFilter
* @Description: 用拦截器没有作用,改变思路,用过滤器实现登录验证,假如没有登录则返回登录页面
* @author Lily
* @date 2020年3月11日
*/
public class LoginFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//首先获取http对象
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
//此处判断,先获得请求路径,然后对请求路径进行分析
/*
*
* request.getRequestURL() 返回全路径
request.getRequestURI() 返回除去host(域名或者ip)部分的路径
request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
request.getServletPath() 返回除去host和工程名部分的路径
*/
String uri=request.getRequestURI();
/*首先对于登录页面我们是可以直接进行访问的,假如没有登录,则判断是否已经登录,即session
是否有值,没有值则不允许访问
*/
if(!uri.endsWith("register.do")&&!uri.endsWith("login.jsp")&&!uri.endsWith("login.do")&&
!uri.endsWith(request.getContextPath()) && !uri.endsWith(request.getContextPath() + "/")){
//下一步想要访问非登录页面,则判断session是否有值
Object loginUser=request.getSession().getAttribute("user");
if(loginUser!=null){
//让他访问
chain.doFilter(req, res);
}else{
//不满足条件,则返回登录页面
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath() + "/system/login.jsp?returnURL=" + url);
}
}else{
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
chain.doFilterは、リクエストが渡されることを意味します。ここでは、便宜上ホワイトリストを設定せず、判断に直接使用しました。