鲜花网站项目(四)————登陆验证拦截器和错误页的相关配置
我们会对进行登陆校验的action使用默认拦截器,这样他就不会被我们设置的拦截器拦截,验证成功后,我们会往session中存入一个数据,然后没有登陆的用户并且需要登录验证拦截器功能的action模块会根据我们的拦截器的进行拦截,拦截的依据就是判断session中有没有我们要的东西,如果有,就放行不予拦截,如果没有,直接拦截,转到eroor页面,让他进行登陆。
public class LoginInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation arg0) throws Exception { // TODO 自动生成的方法存根 HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); String rol = (String)session.getAttribute("role"); if(rol!=null && rol.length() > 0){ if(rol.equals("custom")||rol.equals("admin")){ return arg0.invoke(); } } return "LOGIN"; } }
拦截器中传入的对象是获取不到session的,这个我也不清楚为什么,所以我只能利用通用的调用web资源方式获取session
struts.xml文件中这样配置全局拦截器
<interceptors> <!-- 定义权限控制拦截器 --> <interceptor name="myInterceptor" class="com.jikexueyuan.interceptor.LoginInterceptor" > </interceptor> <!-- 定义一个包含权限控制的拦截器栈 --> <interceptor-stack name="mydefault"> <interceptor-ref name="myInterceptor"> </interceptor-ref> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="mydefault" /> <!-- 定义全局处理结果 --> <global-results> <!-- 逻辑名为login的结果,映射到/login.jsp页面 --> <result name="LOGIN">/user/login.jsp</result> </global-results>
jsp页面分为两种,一种是需要在数据库中调用数据的页面,另一种是不需要在后台数据库调用数据的页面。
详细说说第一种,从后台数据库中调用数据的jsp,
- 他的数据来源肯定是action传递给他的,如果我们用上面的配置文件及拦截器,通过访问action进而访问jsp,if我们没有登陆,session中不会有值,那么这个action将不会正常发生跳转,而是转到login.jsp页面。
- 如果我们直接访问没有登陆的从后台数据库中调用数据的jsp页面,注意不是action,action会因为没有session值而跳转登录页面,而jsp是可以直接访问的,但是这样的话会报错,因为这种jsp本来应该是由action传递数据到jsp,但是我们没有访问action,而是跳过action直接访问jsp,就会因为空指向而报错。这样就要配置错误页来帮助我们跳转的登录页,这样配置
<%@ page errorPage="/error/error.jsp" %>
这个错误页也需要配置一下
<%@ page isErrorPage="true" %>
我们跳转到错误页面是为了,提示出错,然后帮助用户跳转的登陆页面。错误页面代码如下
error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page isErrorPage="true" %> <% String path = request.getContextPath(); %> <!DOCTYPE HTML> <html> <head> <title>出错了!</title> <meta http-equiv='refresh' content='5;url=<%=path %>/user/login.jsp'> <link rel="stylesheet" type="text/css" href="<%=path %>/css/error.css"> <script type="text/javascript" src="<%=path%>/js/error.js"></script> </head> <body> <img src="<%=path %>/img/error.png" > <h4>注意!!页面将在<div id='num' class="inline">5</div>秒后跳转</h4> </body> </html>
这个页面的css代码如下
div.inline{ display: inline-block; width: 50px;text-align: center; } h4{ margin-left: 50px; }
js代码如下
var i=5; function getTime(){ document.getElementById('num').innerHTML="<font color='red'>"+i+"</font>"; i-=1; var x=setTimeout('getTime()',1000) if(i<=0){ clearTimeout(x); } } window.onload=getTime;