首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让错误的DispatcherServlet (spring,tiles2,胸腺嘧啶)处理请求

让错误的DispatcherServlet (spring,tiles2,胸腺嘧啶)处理请求
EN

Stack Overflow用户
提问于 2015-09-27 08:28:27
回答 1查看 1.2K关注 0票数 2

我决定将我的授权功能转移到另一个控制器,但是这给我带来了一些问题。主要是,我的回调控制器无法将GET请求转发到适当的dispatcher servlet。

DispatcherServlet with name 'Auth' processing GET request for [/user/username] (应该是“仪表板”dispatcher servlet)

我的视图层正在使用spring、tiles 2和thymeleaf集成。我发现这个关于堆叠溢出的评论,对我的处境有一些启示。https://stackoverflow.com/a/13406096/2276284

"Secondly, when using Spring + Tiles, and returning some JSP in your tiles definition, it is treated as an internal forward request, and handled by the same servlet as the original request."

我也发现这个堆叠溢出的评论,但它对我不起作用。https://stackoverflow.com/a/17232532/2276284建议返回一个新的ModelAndView,或者使用HttpServletResponse重定向。

如何成功地重定向到另一个控制器/视图?

web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
                             id="pue" version="3.1">
    <!-- webapp properties -->
    <display-name>PUE</display-name>
    <description>Personal User Engagement for Instagram</description>

    <!-- session listener -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

    <!-- root context -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/app-context.xml</param-value>
    </context-param>

    <!-- spring security filter -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- custom redirect filter -->
    <filter>
        <filter-name>pueUsernameAuthFilter</filter-name>
        <filter-class>abnd.pue.auth.service.impl.PUEUsernameAuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>pueUsernameAuthFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- servlet config -->
    <servlet>
        <servlet-name>Auth</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/servlets/auth-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>IgOauth</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/servlets/igoauth-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>Dashboard</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/servlets/dashboard-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- servlet mapping config -->

    <servlet-mapping>
        <servlet-name>Auth</servlet-name>
        <url-pattern>/logout</url-pattern>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>IgOauth</servlet-name>
        <url-pattern>/ig/oauth/callback</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Dashboard</servlet-name>
        <url-pattern>/user/{username}</url-pattern>
        <url-pattern>/user/{username}/profile</url-pattern>
        <url-pattern>/user/{username}/assets</url-pattern>
    </servlet-mapping>

    <!-- mime types -->
    <mime-mapping>
        <extension>ico</extension>
        <mime-type>image/x-icon</mime-type>
    </mime-mapping>
</web-app>

spring-thymeleaf-tiles.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- thymeleaf view resolvers with tiles integration -->
    <bean id="tilesConfigurer" class="org.thymeleaf.extras.tiles2.spring4.web.configurer.ThymeleafTilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles/tiles.xml</value>
            </list>
        </property>
    </bean>

    <!-- template resolver -->
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/WEB-INF/tiles/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5" />
        <property name="characterEncoding" value="utf-8" />
        <property name="cacheable" value="false" />
    </bean>

    <!-- template engine -->
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver" />
        <property name="additionalDialects">
            <set>
                <bean id="tilesDialect" class="org.thymeleaf.extras.tiles2.dialect.TilesDialect" />
            </set>
        </property>
    </bean>

    <!-- tiles view resolver -->
    <bean id="tilesViewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="viewClass" value="org.thymeleaf.extras.tiles2.spring4.web.view.ThymeleafTilesView" />
        <property name="templateEngine" ref="templateEngine" />
        <property name="characterEncoding" value="utf-8" />
        <property name="order" value="1" />
    </bean>

</beans>

IgOauthController

代码语言:javascript
复制
package abnd.pue.ig.controller;

import java.io.IOException;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import abnd.pue.ig.service.intf.IgOauthService;

@Controller
public class IgOauthController {  
    @Autowired
    private IgOauthService igOauthService;

    private static final Logger logger = LoggerFactory.getLogger(IgOauthController.class);

    /**
     * 
     * @param request
     * @return String
     * @throws IOException
     */
    @RequestMapping(value="/ig/oauth/callback")
    public ModelAndView igCallback(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        // get code parameter
        String code = request.getParameter("code");
        // attempt to get user name from callback
        String username = igOauthService.processCallbackRequest(request, session, code);

        // if username isn't empty redirect to user page
        if (!username.isEmpty()) {
            logger.info("username set: " + username);
            return new ModelAndView ("redirect:/user/" + username);
        }

        logger.info("no username set");

        // otherwise return to index TODO error display
        return new ModelAndView("redirect:/");
    }

}
EN

回答 1

Stack Overflow用户

发布于 2015-09-30 00:12:58

好的,谢谢你们的帮助。因此,问题是我无法将我的视图从默认的DispatcherServlet重定向。我还在web.xml中使用无效的url模式,同时试图创建动态url。

答案是重组我的servlet路径的连接,并将默认servlet从Auth更改为仪表板。我还实现了UrlRewriteFilter,将所有流量从根上下文("/")重定向到"/login“

以下是受影响的更改。

web.xml

代码语言:javascript
复制
<!-- servlet mapping config -->
<servlet-mapping>
    <servlet-name>Auth</servlet-name>
    <url-pattern>/login</url-pattern>
    <url-pattern>/logout</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>IgOauth</servlet-name>
    <url-pattern>/ig/oauth/callback</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Dashboard</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

IgOauthController

代码语言:javascript
复制
@Controller
@RequestMapping(value = "/ig/oauth")
public class IgOauthController {  
    @Autowired
    private IgOauthService igOauthService;

    private static final Logger logger = LoggerFactory.getLogger(IgOauthController.class);

    /**
     * 
     * @param request
     * @return String
     * @throws IOException
     */
    @RequestMapping(value="/callback")
    public void igCallback(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        // get code parameter
        String code = request.getParameter("code");
        // attempt to get user name from callback
        String username = igOauthService.processCallbackRequest(request, session, code);

        // if username isn't empty redirect to user page
        if (!username.isEmpty()) {
            logger.info("username set: " + username);
            response.sendRedirect("/" + username + "/dashboard");
            return;
        }

        logger.info("no username set");

        // otherwise return to index TODO error display
        response.sendRedirect("/login");
        return;
    }

}

DashboardController

代码语言:javascript
复制
@Controller
@RequestMapping(value = "/{username}")
public class DashboardController {

    @RequestMapping(value = "/dashboard", method=RequestMethod.GET)
    public ModelAndView userDashboard() throws InstagramException {
        ...
    }

    @RequestMapping(value = "/profile", method=RequestMethod.GET) 
    public ModelAndView userProfile() throws InstagramException {
        ...
    }

    @RequestMapping(value = "/assets", method=RequestMethod.GET) 
    public ModelAndView userAssets() throws InstagramException {
        ...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32806000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档