java-servlets-在基类中设置编码和会话?
我在一个servlet站点上爬行,在几乎每一个doPost中我都会遇到这样的代码:java-servlets-在基类中设置编码和会话?,java,session,inheritance,encoding,servlet-3.0,Java,Session,Inheritance,Encoding,Servlet 3.0,我在一个servlet站点上爬行,在几乎每一个doPost中我都会遇到这样的代码: @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // set encoding to UTF-8 if (request.getCharacterEncoding() ==
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// set encoding to UTF-8
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
// TODO : this may be needed in doGet too ?????????
response.setCharacterEncoding("UTF-8");
// check if session exists
boolean sessionExists = request.isRequestedSessionIdValid();
HttpSession session = request.getSession();
if (!sessionExists)
session.setMaxInactiveInterval(1000);
// if session does not exist we create it
ServletContext context = session.getServletContext();
Integer numSessions = (Integer) context
.getAttribute("numberOfSessions");
if (numSessions == null)
context.setAttribute("numberOfSessions", 1);
else if (!sessionExists)
context.setAttribute("numberOfSessions", ++numSessions);
}
创建一个BaseController类并将此代码移动到那里是一个好主意吗?我应该在init()方法或doPost()中移动它,然后调用super.doPost
?还有像session.setAttribute(“photo”,photo)这样的行代码>在一些servlet中。那么在BaseController中有一个会话
字段是不是一个好主意?如果我理解正确的话,这个字段应该是不稳定的
我对这一切都不熟悉
谢谢您可以将请求字符编码设置移动到帮助器方法,并从doPost调用它。另外,如果编码设置为utf-8以外的值,请检查代码的行为是否正确 另一方面,会话内容有点奇怪。如果要跟踪会话的数量,请删除所有会话并使用javax.servlet.http.HttpSessionListener。它更加优雅,您将在一个地方拥有您的代码 如果需要跟踪属于会话的变量,请继续使用HttpSession类,不要将它们保存在控制器的字段中。您应该使用 例如:
public abstract class BaseController extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if (request.getCharacterEncoding() == null) {
request.setCharacterEncoding("UTF-8");
}
response.setCharacterEncoding("UTF-8"); [...]
doService(request, response);
}
protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception, Error;
}
然后您必须扩展BaseContoller类,实现doService(或其他)方法。谢谢-我的意思是拥有一个
HttpSession volatile会话字段-并调用HttpSession session=request.getSession()。这样看起来更优雅,但在servlet编程中可能不是一个好主意?我(目前)还不知道会话的numberOfSessions
是干什么的-它不是我的代码-我将研究javax.servlet.http.HttpSessionListener。您不需要将会话作为控制器中的字段,servlet容器会处理这个问题。它提供但不提供字段-只有一个方法(getSession()
)。因此,我们的想法是让所有初始化都在BaseController的doPost或init()中进行。您可以使用前面提到的HttpSessionListener初始化会话内的属性。尝试了HttpSessionListener-很遗憾,重新部署时未触发侦听器-看一看,您能详细说明一下吗?也许这就是我想做的(BaseController是“模板”)。谢谢-显然,侦听器和过滤器是一条路要走。不过这个服务方法很好-应该是类似smth的://设置编码;超级服务(请求、响应)代码>