019医疗项目-模块一:用户身份校验拦截器的调试

这次调试发现两个问题:

主要如下:

1.在嵌入的页面中,如果session过期了,跳转到登陆页面

现象:

登陆页面是嵌入在页面中。

解决办法:

找到登录的jsp页面:login.jsp。然后修改里面的登陆提交的回调方法,

问题解决:

解决后如下:

还有问题:

问题2:

3、当执行一个提交操作时,session过期,应该跳转登陆页面,本系统提交返回是json(SubmitResultInfo) ,由于LoginInterceptor拦截器作用,拦截了,返回了登陆页面。

无法解析登陆页面内容。

问题演示:

我们先登录一个账号:

然后,再开一个窗口,输入http://127.0.0.1:8080/yycgproject/first.action

然后点击退出系统,这样的话我们就相当于把这个session给关掉了。接着我们再去看第一个页面,点击“提交”按钮。

结果如下:

不管怎么点击都没有。

原因如下:

我们按下提交,本来应该提交的是@ResponseBody SubmitResultInfo 这种json格式。然后前台页面解析这种json格式给我们结果,但是我们之前配了一个拦截器,这个提交被拦截器拦截了,结果拦截器返回的是request.getRequestDispatcher("/WEB-INF/jsp/base/login.jsp").forward(request, response);这个东西又不是JSON.一:前台页面不能解析啊。二:也不能跳转到"/WEB-INF/jsp/base/login.jsp"。所以就停止不动了。

解决办法:

在拦截器里面抛异常,然后在全局异常处理器里面去解析这个异常做相应的处理。

LoginInterceptor拦截器代码如下:

public class LoginInterceptor implements HandlerInterceptor {
/**
 *
 * 执行时间:进入到action方法之前,
 * 使用场景:用于用户的认证,用户的授权拦截。
 *
 */
    @Override
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
        HttpSession session=request.getSession();
        ActiveUser activeUser=(ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY);
        if(activeUser!=null)//说明从Session中取出来用户对象,那么就放行
        {
            return true;

        }
//如果activeUser是空的,那就是说明用户没有登录。那么我们就要检测用户的要浏览的是不是公共的界面,如果是的话,也可以放行。
        List<String> open_urls=ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS);
        //Config.ANONYMOUS_ACTIONS就是资源的名字就是anonymousActions。说明要从这里去取值,

        //得到用户的url
        String url=request.getRequestURI();

        //遍历资源文件里面是不是包含了我们要访问的那个url.如果包含了,放行。
        for(String open_url:open_urls)
        {

            if(url.indexOf(open_url)>=0)//>=0说明找到位置了
            {
                return true;
            }

        }

        //如果上面的都没哟满足,那么我们就要拦截下来,跳转到用户的登录界面
        //request.getRequestDispatcher("/WEB-INF/jsp/base/login.jsp").forward(request, response);
        ResultUtil.throwExcepion(ResultUtil.createWarning(Config.MESSAGE, 106,null));//106代表的是“此操作需要登陆后进行”

        return false;
    }
/**
 * 执行的时机:进入到Action方法,在返回modelAndView之前执行。
 * 使用场景:在这里统一对返回的数据进行处理,比如统一添加菜单,导航等

 */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }
/**
 * 执行时间:action方法执行完成,已经返回modelAndview,执行
 * 使用的场景:统一处理系统异常,在这里统一记录系统日志,监控action的执行的时间,在preHandle记录开始的时间,在afterCompletion记录结束的时间
 *
 *
 *
 *
 */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {

    }

}
  ResultUtil.throwExcepion(ResultUtil.createWarning(Config.MESSAGE, 106,null));这句话是关键。我们在来看一下全局异常处理器怎么处理这个情况:ExceptionResloverCustom.java:
package yycg.base.process.exception;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import yycg.base.process.result.ExceptionResultInfo;
import yycg.base.process.result.ResultInfo;

//全局异常处理器
public class ExceptionResolverCustom implements HandlerExceptionResolver{
 //json转换器
    private HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter;
    public HttpMessageConverter<ExceptionResultInfo> getJsonMessageConverter() {
        return jsonMessageConverter;
    }
    public void setJsonMessageConverter(
            HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter) {
        this.jsonMessageConverter = jsonMessageConverter;
    }
    //前端控制器
    //handler就是最后要执行的Action类,Springmvc是面向方法开发的。handler就包装了一个方法
    //这个方法就对应于URL的那个方法,
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {

        //输出异常信息
        ex.printStackTrace();
        //在springmvc中,action是被Handle封装起来的,action的方法也被封装到Handle里面了。
        //转成springmvc底层对象,这个底层对象就是对action方法进行封装的那个对象
        HandlerMethod handlerMethod=(HandlerMethod)handler;//这个对象里面只有一个方法。
        Method method=handlerMethod.getMethod();//把这个方法取出来。
        //查找method这个方法上是否有ResponBody这个注解
        ResponseBody responseBody=AnnotationUtils.findAnnotation(method, ResponseBody.class);

        if(responseBody!=null)
        {
            //这里说明Action将异常信息转换成能jsoN输出了

            return this.resolveJsonException(request, response, handlerMethod, ex);
        }

        //异常代码

        //这里说明action返回的是jsp页面
        //解析异常
        ExceptionResultInfo exceptionResultInfo=resolveExceptioncustom(ex);
        int messagecode=exceptionResultInfo.getResultInfo().getMessageCode();
        String view="/base/error";
        if(messagecode==106)
        {

            view="/base/login";

        }
        //将异常信息在异常页面输出。
        request.setAttribute("exceptionResultInfo", exceptionResultInfo.getResultInfo());
        //转向错误页面:用Springmvc的方式去转
    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("exceptionResultInfo", exceptionResultInfo.getResultInfo());
    modelAndView.setViewName(view);
    return modelAndView;
    }

    private ModelAndView resolveJsonException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)
    {
        //解析异常
        ExceptionResultInfo exceptionResultInfo=resolveExceptioncustom(ex);
        HttpOutputMessage outputMessage=new ServletServerHttpResponse(response);

        try {
            //将exceptionResultInfo转成json然后输出,这里直接通过HttpMessageConverter将exceptionResultInfo转化为
            //JSON,然后直接在HttpOutputMessage这个对象中把转化而成的JSON信息写入。输出到客户端。

            jsonMessageConverter.write(exceptionResultInfo,MediaType.APPLICATION_JSON,outputMessage );
        } catch (HttpMessageNotWritableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return new ModelAndView();
    }

    private ExceptionResultInfo resolveExceptioncustom( Exception ex)
    {
        ResultInfo resultInfo=null;

        //这样的话就是系统的自定义异常
        if(ex instanceof ExceptionResultInfo)
        {
            //解析系统的自定义的异常,
            resultInfo=((ExceptionResultInfo) ex).getResultInfo();

        }else {
            //不属于系统自定义异常的话就是未知错误的异常,就是不可知的异常
            resultInfo=new ResultInfo();
            resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);
            resultInfo.setMessage("未知错误异常");

        }
        return new ExceptionResultInfo(resultInfo);

    }

}

主要是这一段:

 String view="/base/error";
        if(messagecode==106)
        {

            view="/base/login";

        }就是说如果不发生之前的那种情况,那就不会抛出106的错误,那么就按以前的方法处理(返回错误页)。如果抛出的是106错误,那么返回登录页。

调试如下:

按下提交按钮后,给出提示。成功了。

时间: 2024-10-12 18:45:09

019医疗项目-模块一:用户身份校验拦截器的调试的相关文章

044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)

我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中这里没有写采购量,我们这篇文章做的就是把采购量写进入,也就是Updata之前的那个记录.这样采购单里面的记录就完整了. 如下: Dao层:用的是逆向工程生成的:yycgdmxMapper.updateByPrimaryKeySelective(yycgdmx_updat

MVC4商城项目二:用户身份验证的实现

用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现对用户中心只有登录的用户才能访问,如果没登录就跳转到登录页面,其它页面都可以访问: 首先来看登录控制器的代码: UserDto user = UserService.GetUserById(Convert.ToInt32(msg.Msg)); //为提供的用户名提供一个身份验证的票据 FormsAu

017医疗项目-模块一:用户登录功能的实现

用户在登录页面上填好姓名和密码还有验证码实现登录. 实现的效果如下: 输入信息后成功. 具体做法代码如下: 我们还是从Dao层开始: 这里用到的Dao层的代码无非就是查名字,查密码什么的.之前就有的,这里的不用了. Service:这一层很重要: 先讲一下这一层要做的东西: 我们要做用户的登录验证. 1.根据传进来的id,去数据库查有没有这个用户,没有直接抛异常,有的话就继续下一步. 2.根据查到的用户sysuser.去查他的存在数据库里面的密码和我们在页面上的密码是不是一致的,一致的就继续,不

052医疗项目-模块五:权限设置-实现根据用户显示不同的菜单

我们之前的做法是: 不管什么类型的用户登录:医院,卫生局等显示的左侧菜单都是一样的.我们在这篇文章里面就要实现不同的用户登录时显示的菜单是不同的. 我们先介绍数据库中的那几张表:那几张表和第三方系统有关. 这几张表对应的是 我们要查的是一个角色的菜单和菜单下的二级菜单: 我们先去看菜单表: 我们看到bss_sys_module就是菜单表(模块表): 这个表里面存放了一级和二级菜单.我们要把一级和二级菜单都查出来: select m1.moduleid,m1.name,m2.moduleid me

【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB引用的空指针异常,造成数据错误,程序崩溃.因此需要一种机制保障每次发送请求执行Action中的方法之前校验用户是否处于登录状态.针对上述分析,可以选用两种实现方式.AOPAOP思想可以在任意方法执行前进行拦截,完成原始方法执行前的操作Struts2拦截器Struts2拦截器可以再Struts2的任意

Struts 2 类型转换器 输入校验 拦截器

Struts 2中内建了字符串类型和常见类型之间相互转换的转换器,能满足大多数转换需求,但不能完成字符串和User对象之间的转换. OGNL项目中有一个TypeConvert接口,这个接口是自定义类型转换器必须要实现的接口,OGNL还提供了一个实现类: DefaultTypeConverter,自定义类型转换器(UserConverter类)须重写DefaultTypeConverter类的convertValue()方法.该方法可以实现字符串和对象之前相互转换 注册局部类型转换器:注册局部类型

后台权限校验拦截器

拦截器类 /* * 后台权限校验的拦截器 * *对没有登陆的用户,不可以进行访问 */ public class PrivilegeInterceptor extends MethodFilterInterceptor { @Override //执行拦截的方法 protected String doIntercept(ActionInvocation actionInvocation) throws Exception { //判断session中是否保存了后台用户的信息 AdminUser

Spring Boot实现一个监听用户请求的拦截器

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } //这

简述拦截器的工作原理以及你在项目中使用过哪些自定义拦截器。

Struts 2中定义了拦截器的接口以及默认实现,实现了Interceptor接口或继承了AbstractInterceptor的类可以作为拦截器.接口中的init()方法在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化.每拦截一个请求,intercept()方法就会被调用一次.destory()方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次. 项目中使用过的有权限拦截器.执行时间拦截器.令牌拦截器等.