Hi Craig,
there are 101 hacks to try and keep the browser from caching.
Problem is that it's a browser implementation on what to cache and what
not, and how the browser determines what to cache when seems subject to
change.
So for me I prefer to assume it doesn't work.
Having said that; except for the last-modified flag my config is the same
as yours. I'll add it - thanks!
If it works, it works.
rg,
Leon.
Op vrijdag 20 december 2024 om 23:43:33 UTC+1 schreef Craig Mitchell:
> *> make sure to clear the cache first*
>
> Sounds like you haven't setup your caching correctly. Mine always works
> perfectly, never have to clear the cache in dev, or when doing a server
> update. Here's my Filter:
>
> /**
> * Tell the browser not to cache the .nocache files, by changing the
> expires time in the HTTP header.
> */
> @Component
> @Order(1)
> public class ServletFilter implements Filter {
> private static final String NO_CACHE = ".nocache.js";
>
> @Override
> public void doFilter(ServletRequest request, ServletResponse response,
> FilterChain chain) throws IOException, ServletException {
> String requestURI = ((HttpServletRequest)request).getRequestURI();
>
> // Don't cache the nocache
> if (requestURI.endsWith(NO_CACHE)) {
> setNoCache((HttpServletResponse)response);
> }
>
> // Request HTTPS
> ((HttpServletResponse)response).setHeader("Strict-Transport-Security",
> "max-age=31536000; includeSubDomains");
>
> chain.doFilter(request, response);
> }
>
> private void setNoCache(HttpServletResponse httpResponse) {
> long currentTime = new Date().getTime();
> httpResponse.setDateHeader("Last-Modified", currentTime);
> httpResponse.setDateHeader("Expires", currentTime - 86400000L);
> httpResponse.setHeader("Pragma", "no-cache");
> httpResponse.setHeader("Cache-Control", "no-store");
> }
> }
>
> On Friday, 20 December 2024 at 4:40:22 pm UTC+11 Leon wrote:
>
>> One thing that is also quite relevant when developing a GWT application
>> is to realize that all GWT generated code lives in the browser and that
>> browser caching can be a problem. Whenever you do a GWT compile and want to
>> check the result in the browser, make sure to clear the cache first because
>> the old code will very likely not be reloaded.
>> I always have the developer mode in the browser open when developing and
>> never click reload, but always 'empty cache and hard reload'. You will need
>> it a lot.
>> The same goes for server updates. Best to do them late in the day or
>> early in the morning, so users can't have stale code in their browsers.
>> Either that, or learn them to do the hard reload (but you can also try
>> and learn dogs to fly, that might have the same level of success).
>>
>> Neil, I think you are trying to learn GWT in the hardest way possible.
>> GWT is a way to develop a UI using java, but it is not run as java, and
>> at runtime will not have the same possibilities as java.
>> So it has its limitations when compared to what you can do with java on
>> the server.
>> When you've developed something for standard java to work, based on all
>> available libraries and known server possibilities, which you want to port
>> to GWT is like trying to port a sportscar into a tractor. It's not
>> impossible, but it is quite the challenge.
>>
>> On Thu, Dec 19, 2024 at 9:56 PM <[email protected]> wrote:
>>
>>> [email protected]
>>> <https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/google-web-toolkit/topics>
>>> Google
>>> Groups
>>> <https://groups.google.com/forum/?utm_source=digest&utm_medium=email/#!overview>
>>> [image:
>>> Google Groups Logo]
>>> <https://groups.google.com/forum/?utm_source=digest&utm_medium=email/#!overview>
>>>
>>> Topic digest
>>> View all topics
>>> <https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/google-web-toolkit/topics>
>>>
>>>
>>> - Class not included in the set of types for RPC
>>>
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_group_thread_0>
>>>
>>> - 4 Updates
>>> - Digest for [email protected] - 18 updates in 5 topics
>>>
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_group_thread_1>
>>>
>>> - 2 Updates
>>> - Getting 500 error from RPC call
>>>
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_group_thread_2>
>>>
>>> - 6 Updates
>>>
>>> Class not included in the set of types for RPC
>>> <http://groups.google.com/group/google-web-toolkit/t/b942c870bc91dc15?utm_source=digest&utm_medium=email>
>>>
>>> Neil Aggarwal <[email protected]>: Dec 18 10:45PM -0600
>>>
>>> I am getting this error on the server:
>>> Type 'com.propfinancing.puzzle.slitherlink.Line' was not included in the
>>> set of types which can be
>>> serialized by this SerializationPolicy or its Class object could not be
>>> loaded. For security purposes,
>>> this type will not be serialized.: instance = Line 0
>>>
>>> And looking in the .gwt.rpc file, it is not listed there.
>>>
>>> Interestingly, I see this:
>>> com.propfinancing.puzzle.slitherlink.Line$STATUS
>>> which is an Enum in that class so the GWT compiler obviously processed
>>> the
>>> class.
>>>
>>> I did not get any warnings or error messages from the GWT compiler as to
>>> why it
>>> decided it did not like the class so now I have to guess what it did not
>>> like.
>>>
>>> Is there a way to improve the messaging to the user to help understand
>>> what happened?
>>>
>>> Thank you,
>>> Neil
>>>
>>> --
>>> Neil Aggarwal, (972) 834-1565, http://www.propfinancing.com
>>> We offer 30 year loans on single family houses!
>>> Craig Mitchell <[email protected]>: Dec 18 11:08PM -0800
>>>
>>> At a guess, the inner enum needs to be told it can be serialised. Ie:
>>>
>>> import com.google.gwt.user.client.rpc.IsSerializable;
>>>
>>> enum STATUS implements IsSerializable { ... }
>>>
>>> On Thursday, 19 December 2024 at 3:46:31 pm UTC+11 Neil Aggarwal wrote:
>>>
>>> Colin Alworth <[email protected]>: Dec 19 06:19AM -0800
>>>
>>> Enums never need to be marked as serializable - unlike records, the Enum
>>> type itself is always serializable, and GWT-RPC assumes the same. From
>>>
>>> https://www.gwtproject.org/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes
>>>
>>> A type is serializable and can be used in a service interface if one of
>>> the
>>> following is true:
>>> ...
>>> * The type is an enumeration. Enumeration constants are serialized as a
>>> name only; none of the field values are serialized.
>>>
>>>
>>> That error message is indeed what is used when the standard
>>> serialization
>>> policy is read from disk, so you've resolved that earlier issue. Can you
>>> confirm that the policy file does include Line (that is, it is correctly
>>> reachable from the remote service instance)? If not, the GWT-RPC
>>> generator
>>> (run when the compiler is invoked) might not have seen a clear path to
>>> how
>>> this type could be used. Common reasons for that include declaring a
>>> field
>>> as being of type Object, which in your head means that any type could be
>>> assigned, but GWT-RPC doesn't want to mark every possibly class as
>>> potentially serializable (both for security reasons and to avoid
>>> generating
>>> serialization code for your client for every possible type).
>>>
>>> On Thursday, December 19, 2024 at 1:08:53 AM UTC-6
>>> [email protected]
>>> wrote:
>>>
>>> Neil Aggarwal <[email protected]>: Dec 19 10:11AM -0600
>>>
>>> > Enumeration constants are serialized as a name only; none of the field
>>> values are serialized.
>>>
>>>
>>>
>>> What are the consequences of not having the values?
>>>
>>> Reading on the Internet, it means I can’t use valueOf() and ordinal().
>>>
>>> But, does it work normally otherwise?
>>>
>>> Can I assign a constant value to a field, read that value, and compare
>>> the
>>> value to one of the
>>> constants?
>>>
>>>
>>>
>>> > Can you confirm that the policy file does include Line
>>>
>>>
>>>
>>> It does not have Line in it:
>>>
>>>
>>>
>>> @FinalFields, true
>>>
>>> *com*._3dmathpuzzles.play.client.GetPuzzleService, false, false, false,
>>> false, _, 4203465842
>>>
>>> *com*._3dmathpuzzles.slitherlink.RectangularWithDiagonalsPuzzle, true,
>>> true, false, false,
>>> *com*._3dmathpuzzles.slitherlink.RectangularWithDiagonalsPuzzle/
>>> 2547295082 <(254)%20729-5082>,
>>> 2547295082 <(254)%20729-5082>
>>>
>>> com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true,
>>> true, true, true,
>>>
>>> com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533,
>>> 3936916533
>>>
>>> com.google.gwt.user.client.rpc.RpcTokenException, true, true, false,
>>> false,
>>> com.google.gwt.user.client.rpc.RpcTokenException/2345075298
>>> <(234)%20507-5298>, 2345075298 <(234)%20507-5298>
>>>
>>> com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true,
>>> com.google.gwt.user.client.rpc.XsrfToken/4254043109 <(425)%20404-3109>,
>>> 4254043109 <(425)%20404-3109>
>>>
>>> com.propfinancing.puzzle.Puzzle, true, false, false, false,
>>> com.propfinancing.puzzle.Puzzle/1723715424, 1723715424
>>>
>>> com.propfinancing.puzzle.slitherlink.Box, true, true, false, false,
>>> com.propfinancing.puzzle.slitherlink.Box/1302152982, 1302152982
>>>
>>> com.propfinancing.puzzle.slitherlink.Box$STATE, true, true, false, false,
>>> com.propfinancing.puzzle.slitherlink.Box$STATE/1639054469, 1639054469
>>>
>>> com.propfinancing.puzzle.slitherlink.BoxWithDiagonals, true, true, false,
>>> false, com.propfinancing.puzzle.slitherlink.BoxWithDiagonals/2774485663,
>>> 2774485663
>>>
>>> com.propfinancing.puzzle.slitherlink.Component, true, false, false,
>>> false,
>>> com.propfinancing.puzzle.slitherlink.Component/4011233562, 4011233562
>>>
>>> com.propfinancing.puzzle.slitherlink.Line$STATUS, true, true, false,
>>> false,
>>> com.propfinancing.puzzle.slitherlink.Line$STATUS/1640439993, 1640439993
>>>
>>> com.propfinancing.puzzle.slitherlink.NumberedBox, true, true, false,
>>> false,
>>> com.propfinancing.puzzle.slitherlink.NumberedBox/1782628205, 1782628205
>>>
>>> com.propfinancing.puzzle.slitherlink.Puzzle, true, false, false, false,
>>> com.propfinancing.puzzle.slitherlink.Puzzle/2584703185, 2584703185
>>>
>>> com.propfinancing.puzzle.slitherlink.RectangularPuzzle, true, false,
>>> false,
>>> false, com.propfinancing.puzzle.slitherlink.RectangularPuzzle/3177548746
>>> <(317)%20754-8746>,
>>> 3177548746 <(317)%20754-8746>
>>>
>>> com.propfinancing.puzzle.slitherlink.RectangularWithDiagonalsPuzzle,
>>> true,
>>> false, false, false,
>>>
>>> com.propfinancing.puzzle.slitherlink.RectangularWithDiagonalsPuzzle/3793384887,
>>> 3793384887
>>>
>>> java.lang.Exception, true, false, true, false,
>>> java.lang.Exception/1920171873, 1920171873
>>>
>>> java.lang.RuntimeException, true, false, true, false,
>>> java.lang.RuntimeException/515124647, 515124647
>>>
>>> java.lang.String, true, true, true, true, java.lang.String/2004016611,
>>> 2004016611
>>>
>>> java.lang.Throwable, true, false, true, false,
>>> java.lang.Throwable/2953622131, 2953622131
>>>
>>> java.util.ArrayList, true, true, false, false,
>>> java.util.ArrayList/4159755760 <(415)%20975-5760>, 4159755760
>>> <(415)%20975-5760>
>>>
>>> java.util.HashMap, true, true, false, false,
>>> java.util.HashMap/1797211028,
>>> 1797211028
>>>
>>> java.util.LinkedHashMap, true, true, false, false,
>>> java.util.LinkedHashMap/3008245022, 3008245022
>>>
>>>
>>>
>>> > the GWT-RPC generator (run when the compiler is invoked) might not have
>>> seen a clear path to how this type could be used
>>>
>>>
>>>
>>> Unfortunately, it is silent about the reason.
>>>
>>> I am hoping we can improve it help the developer instead of leaving me to
>>> make guesses.
>>>
>>>
>>>
>>> Thank you,
>>>
>>> Neil
>>>
>>>
>>>
>>> --
>>>
>>> Neil Aggarwal, (972) 834-1565, http://www.propfinancing.com
>>>
>>> We offer 30 year loans on single family houses!
>>> Back to top
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_digest_top>
>>>
>>> Digest for [email protected] - 18 updates in 5 topics
>>> <http://groups.google.com/group/google-web-toolkit/t/5ccddbca51e8cc16?utm_source=digest&utm_medium=email>
>>>
>>> Leon <[email protected]>: Dec 19 07:50AM +0100
>>>
>>> Hi Neil,
>>>
>>> If you hardcode an url in your GWT calls, it will be tied to that
>>> specific
>>> url. Local testing will not be possible (outside of hacking your own
>>> hosts
>>> file) and if you modify your servername you'll need to update your source
>>> code.
>>>
>>> The webserver is the perfect place to forward your request to the tomcat
>>> instance.
>>> For apache webserver you can do this with the mod_proxy module. Nginx has
>>> the same with proxy_forward (or something similar, don't know by heart).
>>>
>>> rg,
>>>
>>> Leon.
>>>
>>> Vassilis Virvilis <[email protected]>: Dec 19 09:15AM +0200
>>>
>>> I agree with Leon and I can only add that there is also libapache2-mod-jk
>>> to directly proxy from apache to tomcat. The elevator's pitch is about
>>> speed but I think that is also simpler to understand and setup.
>>>
>>>
>>> --
>>> Vassilis Virvilis
>>> Back to top
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_digest_top>
>>>
>>> Getting 500 error from RPC call
>>> <http://groups.google.com/group/google-web-toolkit/t/2a4ae7b373d7b76e?utm_source=digest&utm_medium=email>
>>>
>>> Neil Aggarwal <[email protected]>: Dec 18 03:48PM -0600
>>>
>>> I wrote a very simple class:
>>>
>>>
>>>
>>> *package* com._3dmathpuzzles.slitherlink;
>>>
>>>
>>>
>>> *import* java.io.Serializable;
>>>
>>>
>>>
>>> *public* *class* TestPuzzle *implements* Serializable {
>>>
>>> *private* *static* *final* *long* *serialVersionUID* = 1L;
>>>
>>>
>>>
>>> /** Constructor */
>>>
>>> *public* TestPuzzle() {
>>>
>>> *super*();
>>>
>>> }
>>>
>>> }
>>>
>>>
>>>
>>> And updated my RPC call to use it and I still get this:
>>>
>>>
>>>
>>> Exception while dispatching incoming RPC call
>>>
>>> com.google.gwt.user.client.rpc.SerializationException:
>>>
>>> Type 'com._3dmathpuzzles.slitherlink.TestPuzzle' was not assignable to
>>>
>>> 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom
>>> field serializer.
>>>
>>> For security purposes, this type will not be serialized.: instance =
>>>
>>> com._3dmathpuzzles.slitherlink.TestPuzzle@40a58058
>>>
>>>
>>>
>>> I am not sure what to do about this. My class implements Serializable
>>> and has a no-arg constructor.
>>>
>>>
>>>
>>> Thank you,
>>>
>>> Neil
>>>
>>>
>>>
>>> --
>>>
>>> Neil Aggarwal, (972) 834-1565, http://www.propfinancing.com
>>>
>>> We offer 30 year loans on single family houses!
>>> Colin Alworth <[email protected]>: Dec 18 01:57PM -0800
>>>
>>> You're triggering the LegacySerializationPolicy... we should make that
>>> clearer when it happens.
>>>
>>> This occurs when your <hash>.gwt.rpc policy file wasn't present on the
>>> server (or wasnt at the expected path). Legacy serialization is much
>>> more
>>> strict in what it will accept.
>>>
>>> Generated policy files ensure that the server and client agree on what
>>> can
>>> be serialized. This file is generated into the same directory as your
>>> .nocache.js file, and should be available on the server if running in
>>> production. If running with super dev mode and a separate server, you
>>> can
>>> direct the server to download the current policy file from SDM by
>>> specifying system property gwt.codeserver.port with the localhost port
>>> to
>>> the SDM server. Be sure to reload the server application or hot reload
>>> classes if they change, so that the server side classes match the client
>>> (and the client's policy file).
>>>
>>> On Wednesday, December 18, 2024 at 3:48:49 PM UTC-6
>>> [email protected]
>>> wrote:
>>>
>>> Neil Aggarwal <[email protected]>: Dec 18 04:44PM -0600
>>>
>>>
>>> > This occurs when your <hash>.gwt.rpc policy file wasn't present on the
>>> > server (or wasnt at the expected path). Legacy serialization is much
>>> more
>>> > strict in what it will accept.
>>>
>>> I saw a warning about that in the log but not know what it meant.
>>> I am serving the client side files from Apache and the server side files
>>> from Tomcat so they are separate.
>>>
>>> Where does the server side code expect the .gwt.rpc file to be?
>>>
>>> Colin Alworth <[email protected]>: Dec 18 06:11PM -0800
>>>
>>> The server expects the client to tell it where the file should be, and
>>> the
>>> client reports that the file should be in the same directory as its
>>> .nocache.js file - we call that the "base directory" of a gwt
>>> application.
>>>
>>> RemoteServiceServlet.getSerializationPolicy is responsible for looking
>>> this
>>> up, based on the incoming request, and the expected name of the
>>> generated
>>> file (according to the client). If using SDM and a port provided as I
>>> mentioned, this method will defer to getCodeServerPolicyUrl() if no
>>> policy
>>> file was found on the server itself. Otherwise, you'll see the warning
>>> you
>>> mentioned.
>>>
>>> On Wednesday, December 18, 2024 at 4:45:23 PM UTC-6
>>> [email protected]
>>> wrote:
>>>
>>> Neil Aggarwal <[email protected]>: Dec 18 10:06PM -0600
>>>
>>> I see this in the log:
>>>
>>>
>>>
>>> com._3dmathpuzzles.play.server.GetPuzzleServiceImpl: ERROR: The module
>>> path
>>> requested, /play/DiagonalSlitherlink/, is not in the same web application
>>> as this servlet, /3dmp. Your module may not be properly configured or
>>> your
>>> client and server code maybe out of date.
>>>
>>>
>>>
>>> Looking at the source code for RemoteServiceServlet, I see that it wants
>>> the module path to start with the
>>> webapp context, but it does not match in my setup.
>>>
>>>
>>>
>>> Is there a way to override the behavior, maybe load it manually or
>>> something?
>>>
>>>
>>>
>>> I see a method putCachedSerializationPolicy but it is private.
>>>
>>>
>>>
>>> Thank you,
>>>
>>> Neil
>>>
>>>
>>>
>>> --
>>>
>>> Neil Aggarwal, (972) 834-1565, http://www.propfinancing.com
>>>
>>> We offer 30 year loans on single family houses!
>>> Neil Aggarwal <[email protected]>: Dec 18 10:21PM -0600
>>>
>>> > The server expects the client to tell it where the file should be, and
>>> the client reports that the file should
>>>
>>> > be in the same directory as its .nocache.js file
>>>
>>> > we call that the "base directory" of a gwt application.
>>>
>>>
>>>
>>> I decided to stop fighting with GWT and moved the module from Apache
>>> to Tomcat. The test RPC started working once I did that.
>>>
>>>
>>>
>>> I changed the code to try to retrieve my DiagonalSlitherlink puzzle, but
>>> it
>>> it is giving me an error. I am investigating.
>>>
>>>
>>>
>>> Thanks for the help!
>>>
>>>
>>>
>>> Neil
>>>
>>>
>>>
>>> --
>>>
>>> Neil Aggarwal, (972) 834-1565, http://www.propfinancing.com
>>>
>>> We offer 30 year loans on single family houses!
>>> Back to top
>>> <#m_-7491834135978025578_m_-3755475407748149359_m_-7451696477866393627_digest_top>
>>>
>>> You received this digest because you're subscribed to updates for this
>>> group. You can change your settings on the group membership page
>>> <https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/google-web-toolkit/join>
>>> .
>>> To unsubscribe from this group and stop receiving emails from it send an
>>> email to [email protected].
>>>
>>
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/google-web-toolkit/fc5b7786-994e-44f2-a27e-d4fe1e18305en%40googlegroups.com.