【问题标题】:How to hide the parameter values in url如何隐藏url中的参数值
【发布时间】:2015-03-09 07:28:13
【问题描述】:

我正在开发一个使用 hibernate 和 Spring MVC 架构的项目。 我的问题是我在我的 Web 应用程序中使用 (*.htm) url 模式,在这种情况下,当我将产品的 id 发送到控制器以编辑在 url 中显示的特定产品产品 id 时,例如。

"localhost:8080/MyApp/editProduct.htm?productId=03".

但我不想要这个。我只是想要

"localhost:8080/MyApp/editProduct.htm?productId" or "localhost:8080/MyApp/editProduct.htm/productId/03" 

由于我的 url 模式 (*.htm) 和使用 @PathVariable 注释,我无法在控制器中使用 @PathVariable 注释,因此 JSP 页面永远不会正确加载。 有什么建议么 。提前致谢。

控制器:-

@RequestMapping(value = "/{sId}/deleteState.htm")
public ModelAndView deleteState(@PathVariable("sId") int sId ){
    ModelAndView mav = new ModelAndView();

    try{
        stateDAO.deleteById(sId);
        mav.addAllObjects(prepapareModel());
        mav.addObject("msg", "State Deleted Succesdfully");
        mav.setViewName("admin/viewState");
        return mav;
    }catch(Exception e){
        e.printStackTrace();
        mav.addAllObjects(prepapareModel());
        mav.addObject("err", "Failed to Delete State");
        mav.setViewName("admin/viewState");
        return mav;
    }
}

public Map prepapareModel(){
    Map map = new HashMap();
    map.put("states", stateDAO.findAll());
    return map;
}

从数据库中删除状态后的网址:-

http://localhost:8080/PujaInBox/10/deleteState.htm

我认为状态 ID 正在制造问题。 10 是状态 ID。

【问题讨论】:

  • 要么使用隐藏参数来传递值。或编码 URL。
  • 如果您打算使用路径变量,那么 URL 应该是 localhost:8080/MyApp/productId/03/editProduct.htm 以您的扩展名结尾
  • 另外,如果你真的想隐藏你的参数,为什么不触发 POST 请求而不是 GET 请求?即使使用路径变量,也很容易找到您在 URL 中发送的 productId 值,并且它们在浏览器历史记录中作为 URL 可用,所以它不是那么安全 :)
  • @Prashant ,我没有使用 form ,所以我该如何使用隐藏参数。有没有可能???
  • 那么它只是一个超链接吗?

标签: java spring hibernate


【解决方案1】:

如果你想使用@PathVariable注解,那么URL应该是

/MyApp/productId/03/editProduct.htm - 以你的扩展结尾,你的控制器映射应该是这样的

@RequestMapping(value="/productId/{id}/editProduct")
public String editProduct(@PathVariable String id, Model model) {

}

这里要注意的另一个变化是,我提到了一个相对 URL,而不是像 localhost:8080/MyApp/productId/03/editProduct.htm 这样的绝对 URL,包括主机名和端口。当您在实际服务器中部署应用程序时,这将不起作用,因为localhost 始终指的是您当前的机器,但您的应用程序部署在其他主机上。

希望这是有道理的:)

【讨论】:

  • 它可以工作,但是我的 JSP 页面没有正确加载,这意味着当我使用@PathVariable Annotation 时页面的 CSS 不工作。为什么会这样。 ?
  • 您是否看到您的 css 文件是否已加载到开发工具 -> 网络选项卡中?您还可以发布您对超链接所做的确切 URL 更改吗?
  • 之前:- 删除 现在:- 删除
  • 点击超链接后,您检查浏览器地址栏中的URL是否与您期望的相同?
  • yepp,一切正常。我的意思是我想删除 State ,它完成了。但是当我想重定向状态列表页面时,jsp上没有显示css相关内容,如图像字体等。但一切都是简单的文本格式。
【解决方案2】:

将 servlet 默认 url 模式更改为:

 <servlet-mapping>
    <servlet-name>servlet_name</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

但在这种情况下,更好的选择是在 URL 的中间部分管理您的 @PathVariables,例如:

/myapp/product/{productId}/edit.html

【讨论】:

  • 来吧.. 如果他改变了 servlet 映射,那么即使是静态文件也会被调用
  • @kxyz 我已经试过了,但它对我不起作用。因为我正在使用带有 url 模式 (*.htm) 的安全过滤器。当我更改 web.xml 的 url 模式时,它会抛出异常。
  • 只使用第二种解决方案。因为第一个解决方案更灵活,并且需要在您的项目中进行一些更改。直到是简单的应用程序,它才需要。
【解决方案3】:

我正在课堂上做作业。

我猜第一步是使用通配符 (*) 来映射您的 URL。在您的页面中,您可以使用您喜欢的任何 URL。

然后你可以在你的servlet中调用getPathInfo()方法。

String action = request.getPathInfo();

或者您可以致电getHeader("referer") 获取您的网址,然后操作您的字符串以获取您需要的信息。

最后,您可以将字符串放入 if-else 或 switch 语句中。

【讨论】:

    【解决方案4】:

    您所要做的就是在您的 html 页面中使用 method=post 创建一个表单

    <form method="post">
    

    然后在此表单中创建字段,如果您没有任何应显示的字段,请使用隐藏类型的输入。

    <input type="hidden" name="parametername" id="parameterid" value="parametervalue">
    

    这样就可以了,它不会在 URL 中显示任何参数值,您可以像以前一样访问这些值。

    希望这会有所帮助....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 2017-02-18
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      相关资源
      最近更新 更多