【问题标题】:Spring Web App show user headersSpring Web App 显示用户标题
【发布时间】:2014-10-30 14:18:31
【问题描述】:

我试图在用户打开 Web 应用程序时在浏览器中显示用户信息。我已经制作了一些基本的网络应用程序。我想我在控制器类中犯了一个错误,并且没有在浏览器中打印标题。该应用程序工作正常。我用 maven 打包 war 文件并将其部署到 Tomcat,它可以正确打开 .jsp 文件但不显示我的标题。我将控制器复制到这里,希望有人帮我修复它。

最好的问候!

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class SiteController {

    @Autowired
    private HttpServletRequest request;

    @RequestMapping(value = "/headers", method = RequestMethod.GET)
    public ModelAndView getDomain() {

        ModelAndView modelandView = new ModelAndView("Headers");

        modelandView.addObject("user-agent", getUserAgent());
        modelandView.addObject("headers", getHeadersInfo());

        return modelandView;

    }

    private String getUserAgent() {
        return request.getHeader("user-agent");
    }

    public Map<String, String> getHeadersInfo() {

        Map<String, String> map = new HashMap<String, String>();

        Enumeration headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }

}

【问题讨论】:

  • 你的 JSP 是什么样的?
  • @Elliott Frisch 这是非常简单的 .jsp 文件。只有一个标题:

    Some text here

  • @Nikola:如果您的 JSP 只包含 h1 标记,它将永远不会显示 Spring 模型。请出示 JSP。

标签: java spring maven tomcat user-agent


【解决方案1】:

标题不会凭空出现。使用JSTL标签输出数据:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Show Headers of current user</h1>

<c:forEach var="entry" items="${headers}">
  Key: <c:out value="${entry.key}"/>
  Value: <c:out value="${entry.value}"/>
</c:forEach>

</body>
</html>

【讨论】:

    【解决方案2】:

    您不应该像这样自动装配 HttpServletRequest。它必须在每个请求更新,但 Spring 控制器默认是单例(每个类的单个控制器)。将请求传递给您的任何方法(将自动注入):

    public ModelAndView getDomain(HttpServletRequest request) {
    

    将当前请求传递给您的私有方法:

    ...
    modelandView.addObject("user-agent", getUserAgent(request))
    ...
    
    private String getUserAgent(HttpServletRequest request) {
    ...
    

    您的另一个选择是将控制器放入原型范围 (@Scope("prototype"))。但这意味着对您的应用程序的每次调用都会创建一个新的控制器。最好让它们保持无状态和单例。

    您的 JSP 只是静态的...您需要从 model 中读取值“user-agent”和“headers”:

    ...
    <h1>Show Headers of current user</h1>
    <%= request.getAttribute("user-agent"); %>
    ...
    

    更新

    将 UAD 库添加到您的 WEB-INF/libs 目录。像这样更改“getUserAgentMethod”:

    private ReadableUserAgent getUserAgent(HttpServletRequest request) {
       UserAgentStringParser parser = UADetectorServiceFactory.getResourceModuleParser();
       return parser.parse(request.getHeader("User-Agent"));;
    }
    

    【讨论】:

    • 我有这个结果 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36。现在我使用 Chrome。如果没有其他东西,我如何才能显示我正在使用的浏览器?
    • 您需要在控制器中解析字符串,或者在控制器中使用this library 并返回“浏览器”,而不是整个“用户代理”
    • 我从链接中添加了所有 jar,但是当我用你的方法替换我的方法时,我给了我很多错误?
    【解决方案3】:

    @Elliott Frisch 这是我的 .jsp 文件。我希望它是好的?

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>Show Headers of current user</h1>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多