Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring拦截器在JAVA中不起作用_Java_Spring - Fatal编程技术网

Spring拦截器在JAVA中不起作用

Spring拦截器在JAVA中不起作用,java,spring,Java,Spring,我的项目中有这两个类。当我在配置中使用它们时,我无法提交项目的登录表单。在我填写凭证并单击login之后,我尝试调试应用程序,并意识到表单没有达到发出post请求的方法。我不知道为什么,但是当从配置中删除拦截器时,我的登录没有问题。请帮忙 SessionInterceptor.class public class SessionInterceptor extends HandlerInterceptorAdapter { @Autowired private

我的项目中有这两个类。当我在配置中使用它们时,我无法提交项目的登录表单。在我填写凭证并单击login之后,我尝试调试应用程序,并意识到表单没有达到发出post请求的方法。我不知道为什么,但是当从配置中删除拦截器时,我的登录没有问题。请帮忙

SessionInterceptor.class

 public class SessionInterceptor extends HandlerInterceptorAdapter {

        @Autowired
        private SessionManager sm;

        @Autowired
        private MessageSourceAccessor msa;

        @SuppressWarnings("deprecation")
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {

            String return_url = request.getRequestURL().toString() + "?" + request.getQueryString();
            return_url = return_url.replace(msa.getMessage("config.baseurl"), "");
            if (!request.getRequestURI().contains("login")) {
                if (sm.get(request) == null) {
                    response.sendRedirect(
                            msa.getMessage("config.baseurl") + "/login?return=" + URLEncoder.encode(return_url));
                    return false;
                }
            }
            return true;
        }

    }
SessionManager.class

@Component
public class SessionManager {

    public static final String ProfileUser = "profileuser";

    public UserModel get(HttpServletRequest request) {
        HttpSession session = null;
        session = request.getSession(false);

        if (session == null)
            return null;
        return (UserModel) session.getAttribute(ProfileUser);
    }

    public void set(HttpServletRequest request, UserModel auth) {
        HttpSession session = null;
        session = request.getSession(false);

        if (session == null)
            return;

        session.setAttribute(ProfileUser, auth);
    }

    public void remember(HttpServletRequest request) {
        HttpSession session = null;
        session = request.getSession(false);

        if (session != null)
            session.invalidate();

        session.setMaxInactiveInterval(60 * 60 * 60);
    }

    public void init(HttpServletRequest request, UserModel auth, Boolean remember) {
        HttpSession session = null;
        session = request.getSession(false);

        if (session != null)
            session.invalidate();

        session = request.getSession(true);
        if (remember)
            session.setMaxInactiveInterval(60 * 60 * 60 * 60);
        else
            session.setMaxInactiveInterval(1800);
        session.setAttribute(ProfileUser, auth);
    }

    public void destroy(HttpServletRequest request) {
        HttpSession session = null;
        session = request.getSession(false);

        if (session == null)
            return;

        session.removeAttribute(ProfileUser);
        session.invalidate();
    }

你能提供你的全部配置吗。根据您的代码猜测:

if (!request.getRequestURI().contains("login")) {
    if (sm.get(request) == null) {
        response.sendRedirect(
                msa.getMessage("config.baseurl") + "/login?return=" + URLEncoder.encode(return_url));
        return false;
    }
}
现在,如果您的
sm.get(request)=null,则会发生重定向,因此调用不会转到控制器

重定向意味着呼叫再次转到客户机,从那里新的呼叫将启动到所述url

如果您的
@Autowire
在这种情况下不工作,
sm
将为空。而
sm.get(request)==null将抛出
NullPointerException
。再次呼叫将不会转到控制器


当然,请提供您的配置。或者在拦截器中调试代码。

你想用拦截器完成什么?我决定用这种方式来完成。其他选项是什么?为什么需要拦截器?我试图用它来阻止未登录的用户使用应用程序。这就是spring security的目的,不要重新发明轮子。