项目中遇到的问题及解决办法

时间:2022-08-01 08:55:58

1、中文乱码问题

通过编写一个类实现Filter(过滤器)接口,重写里面的方法,并在doFilter这个方法里面设置字符编码为utf-8,通过ServletRequest.setCharacterEncoding(”utf-8”)来设置;这里之所以用自定义filter(过滤器)来解决这个问题,是因为过滤器在HttpServletRequest到达Servlet之前,会被拦截下来,只有执行过滤器的doFilter方法才会转到下一个链中,注意,需要在web.xml文件中配置信息来创建Filter实例对象;

如果这样都还未解决问题的话,可以修改tomcat目录下的config文件目录下的server.xml文件,需要为每个Connector节点加上一个属性:useBodyEncodingForURI=”true”;

2、表单重复提交问题

我的做法是在服务器端利用session来防止表单重复提交,具体的做法是:在服务端随机生成一个token,同时在当前用户的Session中保存这个token,然后将token发送到客户端的form表单中,在form表单中使用隐藏域来储存这个token

<input type=”hidden” name=”token” value=”${token}”/>采用EL表达式来取出这个值;在表单提交的时候,连同这个token一起提交到服务器端,然后再服务器端判断客户端提交上来的token与服务器端生成的token是否一致,如果不一致,则就是重复提交了,此时服务器端不再处理这个重复提交的表单;如果相同则处理表单,并且清除当前用户的Session中的token,这样第二次提交的时候服务器端的token就不存在了;当然还可以用js来处理这个问题,当用户提交之后将提交按钮设置为disabled,使按钮不可以再触发;

3、数据库中两个表作自然连接(natural join)的时候,如果两个表存在相同名字的字段,比如说A表存在name字段,B表也存在name字段,那么当作A natural join B的时候,如果两个表中的name的内容不相等的时候,则也不会查找出那条内容;所以正确的做法就是将两个表中的name字段分别用a_name,b_name来表示;

4、做这个项目的时候,有一些功能比如说查看发布的职位是不需要用户登录之后的,而有一些操作比如过投递简历是需要用户登录之后才可以操作的,所以就需要为这些操作做出区别,我使用Spring Web MVC 的拦截器来实现这个功能的,首先对不需要用户登录的方法做出标记,比如说方法名用个后缀,然后在拦截器中判断当前请求的url是否包含这个标记,如果有则直接返回,如果没有则需要拦截下来,判断是否已经登录,只有登录了才可以进行操作,否则跳到登录页面;

自定义拦截器需要实现HandlerInterceptor,然后重写里面的preHandle,postHandle和afterCompletion方法,之前的那些操作都是在preHandle方法中实现的。注意拦截器需要在springmvc.xml文件中配置